package org.Date.Enum;

public class TestEnum {
    enum Weekday {
        SUN, MON, TUE, WED, THU, FRI, SAT;
    }

    public enum Color {
        RED, GREEN, BLUE;
    }

    public static void testEnumValue() {
        Weekday day = Weekday.SUN;
        if (day == Weekday.SUN) {
            System.out.println("Work at home!");
        } else {
            System.out.println("Work at office!");
        }
    }

    /*
     * enum的比较
     * 使用enum定义的枚举类是一种引用类型。前面我们讲到，引用类型比较，要使用equals()方法，如果使用==比较，它比较的是两个引用类型的变量是否是同一个对象。因此，引用类型比较，要始终使用equals()方法，但enum类型可以例外。
     *
     * 这是因为enum类型的每个常量在JVM中只有一个唯一实例，所以可以直接用==比较：
     *
     * public final class Color extends Enum { // 继承自Enum，标记为final class
          // 每个实例均为全局唯一:
            public static final Color RED = new Color();
            public static final Color GREEN = new Color();
            public static final Color BLUE = new Color();
            // private构造方法，确保外部无法调用new操作符:
            private Color() {}
        }
     * */

    /*
    但是，如果不小心修改了枚举的顺序，编译器是无法检查出这种逻辑错误的。要编写健壮的代码，就不要依靠ordinal()的返回值。
    因为enum本身是class，所以我们可以定义private的构造方法，并且，给每个枚举常量添加字段：
    * **/
    enum WeekdayExtra {
        MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6), SUN(0);

        public final int dayValue;

        private WeekdayExtra(int dayValue) {
            this.dayValue = dayValue;
        }
    }

    enum WeekdayString {
        MON(1, "星期一"), TUE(2, "星期二"), WED(3, "星期三"), THU(4, "星期四"), FRI(5, "星期五"), SAT(6, "星期六"), SUN(0, "星期日");

        public final int dayValue;
        private final String chinese;

        WeekdayString(int dayValue, String chinese) {
            this.dayValue = dayValue;
            this.chinese = chinese;
        }

        @Override
        public String toString() {
            return chinese;
        }
    }
    public static void testEnumExtra() {
        WeekdayExtra day = WeekdayExtra.SUN;
        if (day.dayValue == 6 || day.dayValue == 0) {
            System.out.println("Work at home!");
        } else {
            System.out.println("Work at office!");
        }

        final WeekdayString mon = WeekdayString.MON;
        mon.toString();

    }

}
